Skip to main content

Tipo di dati: REFERENCE TO

Importante

Con la versione del compilatore >= V3.3.0.0, i riferimenti vengono inizializzati (a 0).

Importante

Se un riferimento fa riferimento a un input del dispositivo, l'accesso viene applicato come accesso in scrittura. Quando il codice viene generato, questo porta all'avviso del compilatore: "...invalid assignment target".

Esempio: rInput REF= Input;

Se hai bisogno di un costrutto di questo tipo, devi prima copiare il valore di input (esempio: rInput) a una variabile con accesso in scrittura.

Un riferimento con il REFERENCE il tipo di dati fa implicitamente riferimento a un altro oggetto. L'incarico viene svolto con il REF= operatore. Quando si accede, il riferimento viene dereferenziato in modo implicito e pertanto non necessita di un operatore di contenuto speciale ^ come un puntatore.

Sintassi

<identifier> : REFERENCE TO <data type> ;
<data type>: base type of the reference
Esempio 214. Dichiarazione valida
PROGRAM PLC_PRG
VAR
    rspeA : REFERENCE TO DUT_SPECIAL;
    pspeA : POINTER TO DUT_SPECIAL;
    speB : DUT_SPECIAL;
END_VAR
rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB);
rspeA := speD; // The code corresponds to pspeA^ := speD;


Esempio 215. Dichiarazioni non valide
ariTest : ARRAY[0..9] OF REFERENCE TO INT;
priTest : POINTER TO REFERENCE TO INT;
rriTest : REFERENCE TO REFERENCE TO INT;
rbitTest : REFERENCE TO BIT;


Un tipo di riferimento non deve essere utilizzato come tipo di base di una matrice, un puntatore o un riferimento. Inoltre, un riferimento non deve fare riferimento a una variabile bit. Questi tipi di costrutti generano errori del compilatore.

Nota

La leggibilità di un programma è resa difficoltosa quando si accede contemporaneamente alla stessa cella di memoria tramite un identificatore ed il suo alias.

Esempio: speB e rspeA

Suggerimento

Riferimenti e puntatori a BIT le variabili sono non valido dichiarazioni, nonché elementi di matrice con tipo base BIT.

Esempio 216. Esempi

Quando vengono assegnati i riferimenti con :=, un valore viene sempre copiato, indipendentemente dal fatto che il riferimento sia a sinistra, a destra o su entrambi i lati:

  • Ref := value scrive il valore value alla posizione a cui punta il riferimento. Nella notazione del puntatore: Ref^ := value

  • value := Ref scrive il valore a cui punta il riferimento dopo value. Nella notazione del puntatore: value := Ref^

  • Ref1 := Ref2 scrive il valore which Ref2 punta a. nel luogo in cui Ref1 punta a. Nella notazione del puntatore: Ref1^ := Ref2^

Quando REF= viene utilizzato, l'indirizzo viene sempre applicato e deve esserci un riferimento sul lato sinistro:

  • Ref REF= value: Il riferimento punta a value. Nella notazione del puntatore: Ref :=ADR(value)

  • Ref1 REF= Ref2: Ref1punta allo stesso valore di Ref2. Nella notazione del puntatore:Ref1 := Ref2

  • Value REF = Ref porta ad un errore di compilazione



Suggerimento

Nella dichiarazione, REFERENCE TO INT REF= value si comporta come REFERENCE TO INT := value.

Confronto tra riferimento e puntatore

. Un riferimento presenta i seguenti vantaggi rispetto a un puntatore:
  • Più facile da usare:

    Un riferimento può accedere al contenuto dell'oggetto referenziato direttamente e senza dereferenziazione.

  • Sintassi più fine e più semplice durante il passaggio di valori:

    Richiamo di un blocco funzione che passa un riferimento senza un operatore di indirizzo invece di un puntatore

    Esempio: fbDoIt(riInput:=iValue);

    Invece di: fbDoIt_1(piInput:=ADR(iValue));

  • Tipo di sicurezza:

    Quando si assegnano due riferimenti, il compilatore controlla se i loro tipi di base corrispondono. Questo non è verificato nel caso dei puntatori.

Verifica della validità di un riferimento

Puoi usare l'operatore __ISVALIDREF per verificare se un riferimento punta o meno a un valore valido (ovvero un valore diverso da 0).

Sintassi

<boolean variable name> := __ISVALIDREF( <reference name> );

<reference name>: Identificatore dichiarato con REFERENCE TO

La variabile booleana è TRUE quando il riferimento punta a un valore valido. Altrimenti lo è FALSE.

PROGRAM PLC_PRG
VAR
    iAlfa : INT;
    riBravo : REFERENCE TO INT;
    riCharlie : REFERENCE TO INT;
    bIsRef_Bravo : BOOL := FALSE;
    bIsRef_Charlie : BOOL := FALSE;
END_VAR
iAlfa := iAlfa + 1;
riBravo REF= iAlfa;
riCharlie REF= 0;
bIsRef_Bravo := __ISVALIDREF(riBravo);  (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *)
bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)

Suggerimento

Nella versione del compilatore 3.5.7.40 e successive, la funzione di monitoraggio implicito CheckPointer agisce su variabili di tipo REFERENCE TO allo stesso modo delle variabili puntatore.